import 'whatwg-fetch'
import fetchJsonp from 'fetch-jsonp'
import { Toast } from 'antd-mobile'
import { helper, config } from './'

/**
 * 包装`fetch`包括获取`jsonp`
 * 参见 npm package whatwg-fetch fetch-jsonp
 * @param  {[string]}  url     [description]
 * @param  {[object]}  options [description]
 * @param  {Boolean}   jsonp   [description]
 * @return {Promise}
 */
function myFetch(url, { method = 'POST', body = '' } = {}, jsonp = false) {
  let options = {}
  // 接口统一增加防止二次提交用32位guid
  if (body === '') {
    const symbol = /\?/.test(url)
    url += `${symbol ? '&' : '?'}guid=${helper.guid()}`
  }
  else {
    const obj = JSON.parse(body)
    obj.guid = helper.guid()
    options = {
      method,
      body: JSON.stringify(obj)
    }
  }

  if (url.startsWith('/')) {
    url = config.rootApi + url
  }

  const promise = (body !== '') ? fetch(url, options)
    : ((jsonp === true) ? fetchJsonp(url) : fetch(url))

  return promise.then(res => res.json())
    .then((json) => {
      if (json.ResultCD === undefined) {
        return json
      }
      const returnCode = json.ResultCD
      // I001 成功
      // EC90 请求报文格式有误
      // EC98 二次提交
      // EC99 系统异常
      // EC01 账号不能为空
      // EC02 会话ID不能为空
      // EC03 连接断开，请重新登录
      // EC04 用户不存在
      // EC05 用户已冻结，不能执行操作
      if (returnCode === 'I001') {
        // 成功
        return json
      }
      if (returnCode === 'EC03' || returnCode === 'EC01') {
        if (/autologin/.test(url)) {
          return
        }

        Toast.hide()
        // // 连接断开，重新登录
        // sessionStorage.removeItem('token')
        // sessionStorage.removeItem('memberUnit')
        // // localStorage.removeItem('customerId')
        // sessionStorage.removeItem('memberNo')
        // sessionStorage.removeItem('authFlag')
        // Toast.fail(json.ErrorMsg, 2, () => {
        //   AppAction.loginStatus('relogin')
        // })
      }
      // 系统异常
      else if (returnCode === 'EC99') {
        if (/\/infos\/member\/get/.test(url)) return
        Toast.hide()
        Toast.fail('系统发生异常！！！')
      }
      else {
        Toast.hide()
        // 轻提示错误
        Toast.fail(json.ErrorMsg)
      }
    })
    .catch(err => helper.onPromiseError(err))
}

export default myFetch